/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package managers;

import DAO.TrabajoDAO;
import JPA.JPATrabajoDAO;
import domain.Entity.EntityGestor;
import domain.Entity.EntityTrabajador;
import domain.Entity.EntityTareaTrabajada;
import domain.Entity.EntityTarea;
import domain.Entity.EntityProyecto;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpSession;
/**
 *
 * @author jorge
 */

 
public class TrabajoManager implements TrabajoManagerInterface {
    
     private TrabajoDAO trabajo;
     private static TrabajoManager instance = null;
        
  	
        public static synchronized TrabajoManager getInstance(){
		if(instance == null){
			instance = new TrabajoManager();
			return instance;
		}
		else
			return instance;
	}
        
	
	private TrabajoManager(){
		this.trabajo =new JPATrabajoDAO();
	}

    public void TrabajoInforme(List resultado, HttpSession session) {
        int horas = 0;
        int minutos=0;
        Iterator it = resultado.iterator();
        while(it.hasNext()){
            EntityTareaTrabajada ett = (EntityTareaTrabajada) it.next();
            horas= horas + Integer.parseInt(ett.getTiempo().charAt(0) +""+ ett.getTiempo().charAt(1));
            minutos= minutos + Integer.parseInt(ett.getTiempo().charAt(3) +""+ ett.getTiempo().charAt(4));
            if(minutos >= 60){
                horas = horas +1 ;
                minutos = minutos -60 ;
            }
        }
        session.setAttribute("horasInforme", horas);
        session.setAttribute("minutosInforme", minutos);
    }

    public List<EntityTareaTrabajada> calculaTareasTrabajadas(List trabajadores, Date fecha) {
        List tareasTrabajadas = new ArrayList();
        Iterator it = trabajadores.iterator();
          while(it.hasNext()){
              EntityTrabajador trabajador = (EntityTrabajador) it.next();
              tareasTrabajadas.addAll(tareasTrabajadas(trabajador, fecha));
          }
        return tareasTrabajadas;
    }
        
        public void calculaTrabajoGestor(EntityGestor eg,HttpSession session){
            
                        Date hoy = new Date();
                        
                        int horasSemanal = 0;
                        int horasMesActual = 0;
                        int horasMesAnterior = 0;
                        int minutosSemanal = 0;
                        int minutosMesActual = 0;
                        int minutosMesAnterior = 0;
                        
                        List trabajos = new ArrayList();
                        List tareasTrabajadas = new ArrayList();
                        Iterator it= eg.getEtr().iterator();
                        Date fechaIniMesActual = new Date(hoy.getYear(),hoy.getMonth(),01);
                        Date fechaFinMesActual = new Date(hoy.getYear(),hoy.getMonth(),31);
                        Date fechaIniMesAnterior = new Date(hoy.getYear(),hoy.getMonth()-1,01);
                        Date fechaFinMesAnterior = new Date(hoy.getYear(),hoy.getMonth()-1,31);
                 
                        Date fechaIniSemana = new Date(hoy.getYear(),hoy.getMonth(),hoy.getDate() - hoy.getDay());
                        Date fechaFinSemana = new Date(hoy.getYear(),hoy.getMonth(),hoy.getDate());
                        
                        
                        while(it.hasNext()){
                            EntityTrabajador etr = (EntityTrabajador) it.next();
                            tareasTrabajadas = trabajo.obetenerTareasTrabajadas(etr, hoy);
                            trabajos.addAll(tareasTrabajadas);
                            List trabajoMensualActual = trabajo.trabajoRealizadoFechas(fechaIniMesActual, etr,fechaFinMesActual);
                            List trabajoMensualAnterior = trabajo.trabajoRealizadoFechas(fechaIniMesAnterior, etr, fechaFinMesAnterior);
                            List trabajoSemanal = trabajo.trabajoRealizadoFechas(fechaIniSemana, etr, fechaFinSemana);
                            
                            Iterator itma = trabajoMensualActual.iterator();
                            while(itma.hasNext()){
                                EntityTareaTrabajada ett = (EntityTareaTrabajada) itma.next();
                                horasMesActual = horasMesActual + Integer.parseInt(ett.getTiempo().charAt(0) +""+ ett.getTiempo().charAt(1));
                                minutosMesActual = minutosMesActual + Integer.parseInt(ett.getTiempo().charAt(3) +""+ ett.getTiempo().charAt(4));
                                if(minutosMesActual > 60){
                                    horasMesActual++;
                                    minutosMesActual = minutosMesActual -60;
                                }
                                
                            }
                            
                            Iterator itm = trabajoMensualAnterior.iterator();
                            while(itm.hasNext()){
                                EntityTareaTrabajada ett = (EntityTareaTrabajada) itm.next();
                                horasMesAnterior = horasMesAnterior + Integer.parseInt(ett.getTiempo().charAt(0) +""+ ett.getTiempo().charAt(1));
                                minutosMesAnterior = minutosMesAnterior + Integer.parseInt(ett.getTiempo().charAt(3) +""+ ett.getTiempo().charAt(4));
                                if(minutosMesAnterior > 60){
                                    horasMesAnterior++;
                                    minutosMesAnterior = minutosMesAnterior -60;
                                }
                                
                            }
                             
                            Iterator its = trabajoSemanal.iterator();
                            while(its.hasNext()){
                                EntityTareaTrabajada ett = (EntityTareaTrabajada) its.next();
                                horasSemanal = horasSemanal + horasMesAnterior + Integer.parseInt(ett.getTiempo().charAt(0) +""+ ett.getTiempo().charAt(1));
                                minutosSemanal = minutosSemanal + Integer.parseInt(ett.getTiempo().charAt(3) +""+ ett.getTiempo().charAt(4));
                                if(minutosSemanal > 60){
                                    horasSemanal++;
                                    minutosSemanal = minutosSemanal -60;
                                }
                                
                            } 
                            
                        }
                        
                        int trabajoMensual = 100;
                        int trabajoSemanal = 100;
                        if(!eg.getEtr().isEmpty()){
                        
                            trabajoMensual = eg.getEtr().size()* 8 * 22 ;
                            trabajoSemanal = eg.getEtr().size()* 8 * 5 ;
                        }
                        
                        horasMesActual = (100*horasMesActual)/trabajoMensual;
                        trabajoMensual = 100 -horasMesActual;
                        
                        horasMesAnterior = (100*horasMesAnterior)/trabajoMensual;
                        int trabajoMensualAnterior = 100 -horasMesAnterior;
                        
                        horasSemanal = (100*horasSemanal)/trabajoSemanal;
                        trabajoSemanal = 100 -horasSemanal;
                        
                        
                        
                        session.setAttribute("totalHMA", trabajoMensualAnterior);
                        session.setAttribute("totalHM", trabajoMensual);
                        session.setAttribute("totalhorasSemana", trabajoSemanal);
                        session.setAttribute("horasMesActual", horasMesActual);
                        session.setAttribute("horasMesAnterior", horasMesAnterior);
                        session.setAttribute("horasSemanal", horasSemanal);
                        
                        session.setAttribute("trabajosdehoy", trabajos);            
         
        }

    public void calculaTrabajotrabajador(EntityTrabajador etr, HttpSession session) {
        
        Date hoy = new Date();
        
        List tareasTrabajadas = trabajo.obetenerTareasTrabajadas(etr, hoy);
                        
                        
                        int horasSemanal = 0;
                        int horasMesActual = 0;
                        int horasMesAnterior = 0;
                        int minutosSemanal = 0;
                        int minutosMesActual = 0;
                        int minutosMesAnterior = 0;
                        
                        Date fechaIniMesActual = new Date(hoy.getYear(),hoy.getMonth(),01);
                        Date fechaFinMesActual = new Date(hoy.getYear(),hoy.getMonth(),31);
                        Date fechaIniMesAnterior = new Date(hoy.getYear(),hoy.getMonth()-1,01);
                        Date fechaFinMesAnterior = new Date(hoy.getYear(),hoy.getMonth()-1,31);
                 
                        Date fechaIniSemana = new Date(hoy.getYear(),hoy.getMonth(),hoy.getDate() - hoy.getDay());
                        Date fechaFinSemana = new Date(hoy.getYear(),hoy.getMonth(),hoy.getDate());
                        
                        List trabajoMensualActual = trabajo.trabajoRealizadoFechas(fechaIniMesActual, etr,fechaFinMesActual);
                        List trabajoMensualAnterior = trabajo.trabajoRealizadoFechas(fechaIniMesAnterior, etr, fechaFinMesAnterior);
                        List trabajoSemanal = trabajo.trabajoRealizadoFechas(fechaIniSemana, etr, fechaFinSemana);
                            
                        Iterator itma = trabajoMensualActual.iterator();
                        while(itma.hasNext()){
                                EntityTareaTrabajada ett = (EntityTareaTrabajada) itma.next();
                                horasMesActual = horasMesActual + Integer.parseInt(ett.getTiempo().charAt(0) +""+ ett.getTiempo().charAt(1));
                                minutosMesActual = minutosMesActual + Integer.parseInt(ett.getTiempo().charAt(3) +""+ ett.getTiempo().charAt(4));
                                if(minutosMesActual > 60){
                                    horasMesActual++;
                                    minutosMesActual = minutosMesActual -60;
                                }
                                
                            }
                            
                            Iterator itm = trabajoMensualAnterior.iterator();
                            while(itm.hasNext()){
                                EntityTareaTrabajada ett = (EntityTareaTrabajada) itm.next();
                                horasMesAnterior = horasMesAnterior + Integer.parseInt(ett.getTiempo().charAt(0) +""+ ett.getTiempo().charAt(1));
                                minutosMesAnterior = minutosMesAnterior + Integer.parseInt(ett.getTiempo().charAt(3) +""+ ett.getTiempo().charAt(4));
                                if(minutosMesAnterior > 60){
                                    horasMesAnterior++;
                                    minutosMesAnterior = minutosMesAnterior -60;
                                }
                                
                            }
                             
                            Iterator its = trabajoSemanal.iterator();
                            while(its.hasNext()){
                                EntityTareaTrabajada ett = (EntityTareaTrabajada) its.next();
                                horasSemanal = horasSemanal + Integer.parseInt(ett.getTiempo().charAt(0) +""+ ett.getTiempo().charAt(1));
                                minutosSemanal = minutosSemanal + Integer.parseInt(ett.getTiempo().charAt(3) +""+ ett.getTiempo().charAt(4));
                                if(minutosSemanal > 60){
                                    horasSemanal++;
                                    minutosSemanal = minutosSemanal -60;
                                }
                            }   
                        
                            
                        horasMesActual = (100*horasMesActual)/(8*22);
                        int trabajoMensual = 100 -horasMesActual;
                        
                        horasMesAnterior = (100*horasMesAnterior)/(8*22);
                        int trabajoMensualAnt = 100 -horasMesAnterior;
                        
                        horasSemanal = (100*horasSemanal)/(8*22);
                        int trabajoSem = 100 -horasSemanal;
                        
                        
                        
                        session.setAttribute("totalHMA", trabajoMensualAnt);
                        session.setAttribute("totalHM", trabajoMensual);
                        session.setAttribute("totalhorasSemana", trabajoSem);
                        session.setAttribute("horasMesActual", horasMesActual);
                        session.setAttribute("horasMesAnterior", horasMesAnterior);
                        session.setAttribute("horasSemanal", horasSemanal);
                        
                        session.setAttribute("trabajosdehoy", tareasTrabajadas);
        
    }

    public List obtenerTiempos(EntityTarea et) {
        List tiempos = new ArrayList();
        Iterator it1 = et.getEtr().iterator();
            while(it1.hasNext()){
                EntityTrabajador etr = (EntityTrabajador) it1.next();
                List trabajados = trabajo.obtenerTiempoTrabajadoTarea(etr, et);
                Iterator it2 = trabajados.iterator();
                int ht = 0;
                int mt = 0;
                while(it2.hasNext()){
                    EntityTareaTrabajada ett =  (EntityTareaTrabajada) it2.next();
                    int htt = Integer.parseInt(ett.getTiempo().charAt(0) +""+ ett.getTiempo().charAt(1));
                    int mtt = Integer.parseInt(ett.getTiempo().charAt(3) +""+ ett.getTiempo().charAt(4));
                    ht = ht + htt;
                    mt = mt + mtt;
                    if(mt > 60){
                        mt = mt - 60;
                        ht = ht + 1;
                    }
                }   
                etr.setHoras(ht);
                etr.setMinutos(mt);
                tiempos.add(etr);
            }
         return tiempos;   
    }

    public List obtenertiemposTrabajador(EntityTrabajador etr) {
        
        List tiempos = new ArrayList();
        Iterator it1 = etr.getEt().iterator();
            while(it1.hasNext()){
                EntityTarea et = (EntityTarea) it1.next();
                List trabajados = trabajo.obtenerTiempoTrabajadoTarea(etr, et);
                Iterator it2 = trabajados.iterator();
                int ht = 0;
                int mt = 0;
                while(it2.hasNext()){
                    EntityTareaTrabajada ett =  (EntityTareaTrabajada) it2.next();
                    int htt = Integer.parseInt(ett.getTiempo().charAt(0) +""+ ett.getTiempo().charAt(1));
                    int mtt = Integer.parseInt(ett.getTiempo().charAt(3) +""+ ett.getTiempo().charAt(4));
                    ht = ht + htt;
                    mt = mt + mtt;
                    if(mt > 60){
                        mt = mt - 60;
                        ht = ht + 1;
                    }
                }   
                
               et.setHoras(ht);
               et.setMinutos(mt);
               tiempos.add(et);
            }
        return tiempos;    
    }
    
    public void trabajar(EntityTareaTrabajada ett,EntityTrabajador etr, EntityTarea et, EntityProyecto ep,Time tiempoTrabajado) {
            
        double horasProyecto = ep.getHoras();
        double horasMaximas = ep.getHoras_maximas();
        double porcentajeProyecto = ((horasProyecto / horasMaximas) * 100);
        ep.setPorcentaje((int) porcentajeProyecto);
        
        et = calculaTiempoTarea(et,tiempoTrabajado);
        double horasTarea = et.getHoras();
        double porcentajeTarea = ((horasTarea / horasProyecto) * 100);
        et.setPorcentaje((int) porcentajeTarea);
       
        etr = calculaTiempoTrabajador(etr,tiempoTrabajado);
        trabajo.trabajarTarea(ett, etr, et, ep);
        
    }    
    
    public List<EntityTareaTrabajada> tareasTrabajadas(EntityTrabajador etr,Date fecha){
        return trabajo.obetenerTareasTrabajadas(etr, fecha);
    }
    
    public boolean estaTrabajando(Date fecha, Time tiempoFinal, Time tiempoInicial,EntityTrabajador etr) {
        
        List tareasTrabajadas = trabajo.obetenerTareasTrabajadas(etr, fecha);
        boolean b = false;
        Iterator it = tareasTrabajadas.iterator();
        while(it.hasNext() && !b){
            EntityTareaTrabajada ett = (EntityTareaTrabajada) it.next();
            int horaIni = Integer.parseInt(ett.getHora_ini().charAt(0) +""+ ett.getHora_ini().charAt(1));
            int minutosIni = Integer.parseInt(ett.getHora_ini().charAt(3) +""+ ett.getHora_ini().charAt(4));
            int horaFin = Integer.parseInt(ett.getHora_fin().charAt(0) +""+ ett.getHora_fin().charAt(1));
            int minutosFin = Integer.parseInt(ett.getHora_fin().charAt(3) +""+ ett.getHora_fin().charAt(4));
              
            if((horaIni < tiempoInicial.getHours()) || (horaIni == tiempoInicial.getHours() && minutosIni < tiempoInicial.getMinutes()) ){
                  if(horaFin > tiempoInicial.getHours()){
                         b = true;
                  }else if(horaFin == tiempoInicial.getHours() && minutosFin > tiempoInicial.getMinutes() ) {
                         b = true;   
                  }
            }else if((horaIni < tiempoFinal.getHours()) || (horaIni == tiempoFinal.getHours() && minutosIni < tiempoFinal.getMinutes()) ){
                        b = true;
            }
        }     
        return b;
    }
    
    public boolean fechaLimite(Date fecha, EntityTarea et) {
        boolean b = false;
        if(et.getFecha_ini() != null ){
            if(fecha.compareTo(et.getFecha_ini()) < 0 ){
                b = true;
            }
        }    
        if(et.getFecha_fin() != null && !b){
           if(fecha.compareTo(et.getFecha_fin()) > 0){
               b = true;
           }
        }
        
        if(fecha.compareTo(et.getEpy().getFecha_ini()) < 0 ){
            b = true;
        }
        
        if(fecha.compareTo(et.getEpy().getFecha_fin()) > 0 ){
            b = true;
        }
        
        return b;
        }
    
    public Time calculaTiempoFinal(String horaFin) {
        int hf= Integer.parseInt(horaFin.charAt(0) +""+ horaFin.charAt(1));
        int mf= Integer.parseInt(horaFin.charAt(3) +""+ horaFin.charAt(4));
        Time tiempoFinal = new Time(hf,mf,0);
        return tiempoFinal;
    }

    public Time calculaTiempoInicial(String horaIni) {
        int hi= Integer.parseInt(horaIni.charAt(0) +""+ horaIni.charAt(1));
        int mi= Integer.parseInt(horaIni.charAt(3) +""+ horaIni.charAt(4));
        Time tiempoInicial = new Time(hi,mi,0);
        return tiempoInicial;
    }

    public EntityProyecto calculaTiempoProyecto(EntityProyecto ep, Time tiempoTrabajado) {
        
        int horasTiempoProyecto = ep.getHoras();
        horasTiempoProyecto = horasTiempoProyecto + tiempoTrabajado.getHours();
        int minutosTiempoProyecto = ep.getMinutos();
        minutosTiempoProyecto = minutosTiempoProyecto + tiempoTrabajado.getMinutes();
        if(minutosTiempoProyecto  > 60){
           horasTiempoProyecto = horasTiempoProyecto + 1;
           minutosTiempoProyecto = minutosTiempoProyecto - 60;
        }
        ep.setHoras(horasTiempoProyecto);
        ep.setMinutos(minutosTiempoProyecto);
        return ep;
    }

    public EntityTarea calculaTiempoTarea(EntityTarea et, Time tiempoTrabajado) {
        
        
        int horasTiempoTarea = et.getHoras();
        horasTiempoTarea = horasTiempoTarea + tiempoTrabajado.getHours();
        int minutosTiempoTarea = et.getMinutos();
        minutosTiempoTarea = minutosTiempoTarea + tiempoTrabajado.getMinutes();
        if(minutosTiempoTarea  > 60){
           horasTiempoTarea = horasTiempoTarea + 1;
           minutosTiempoTarea = minutosTiempoTarea - 60;
        }
        et.setHoras(horasTiempoTarea);
        et.setMinutos(minutosTiempoTarea);
        return et;
    }

    public String calculaTiempoTareaTrabajada(Time tiempoTrabajado) {
        String tiempoTareaTrabajado = "";
        if(tiempoTrabajado.getHours() == 0 || tiempoTrabajado.getHours() == 1 || tiempoTrabajado.getHours() == 2 || tiempoTrabajado.getHours() == 3 || tiempoTrabajado.getHours() == 4 || tiempoTrabajado.getHours() == 5 || tiempoTrabajado.getHours() == 6 || tiempoTrabajado.getHours() == 7 || tiempoTrabajado.getHours() == 8 || tiempoTrabajado.getHours() == 9){
            
            tiempoTareaTrabajado = "0"+ tiempoTrabajado.getHours()+":";
            
        }else{
            
            tiempoTareaTrabajado = tiempoTrabajado.getHours()+":";
            
        }
        
        if(tiempoTrabajado.getMinutes() == 0 || tiempoTrabajado.getMinutes() == 1 || tiempoTrabajado.getMinutes() == 2 || tiempoTrabajado.getMinutes() == 3 || tiempoTrabajado.getMinutes() == 4 ||tiempoTrabajado.getMinutes() == 5 || tiempoTrabajado.getMinutes() == 6 || tiempoTrabajado.getMinutes() == 7 || tiempoTrabajado.getMinutes() == 8 || tiempoTrabajado.getMinutes() == 9){
         
            tiempoTareaTrabajado = tiempoTareaTrabajado.concat("0"+ tiempoTrabajado.getMinutes());
           
        }else{
            
            tiempoTareaTrabajado = tiempoTareaTrabajado.concat(""+tiempoTrabajado.getMinutes()+"");
            
        }    
        
        return tiempoTareaTrabajado;
    }

    public Time calculaTiempoTrabajado(Time tiempoInicial, Time tiempoFinal) {
        int hi = tiempoInicial.getHours();
        int hf = tiempoFinal.getHours();
        int mi = tiempoInicial.getMinutes();
        int mf = tiempoFinal.getMinutes();
        int ht = hf - hi ;
        if(mf - mi < 0){
            ht = ht -1;
        }
        int mt = mf - mi;
        if(mt < 0){
            mt = 60 + mt;
        }
        Time tiempoTrabajado = new Time(ht,mt,0); 
        return tiempoTrabajado;
    }

    public EntityTrabajador calculaTiempoTrabajador(EntityTrabajador etr, Time tiempoTrabajado) {
        
        int horasTiempoTrabajador = etr.getHoras();
        horasTiempoTrabajador = horasTiempoTrabajador + tiempoTrabajado.getHours();
        int minutosTiempoTrabajador = etr.getMinutos();
        minutosTiempoTrabajador = minutosTiempoTrabajador + tiempoTrabajado.getMinutes();
        if(minutosTiempoTrabajador  > 60){
           horasTiempoTrabajador = horasTiempoTrabajador + 1;
           minutosTiempoTrabajador = minutosTiempoTrabajador - 60;
        }
        etr.setHoras(horasTiempoTrabajador);
        etr.setMinutos(minutosTiempoTrabajador);
        return etr;
    }

    public List trabajoentreFechas(Date fecIni, EntityTrabajador trabajador, Date fecFin) {
        return trabajo.trabajoRealizadoFechas(fecIni, trabajador, fecFin);
    }

    public EntityTareaTrabajada crearTrabajo(Date fecha, String Hora_Ini, String Hora_Fin, String tiempoTareaTrabajada, EntityTarea et, EntityTrabajador etr, String comentario ){
        
        EntityTareaTrabajada ett = new EntityTareaTrabajada();
        
        ett.setFecha(fecha);
        ett.setHora_ini(Hora_Ini);
        ett.setHora_fin(Hora_Fin);
        ett.setTiempo(tiempoTareaTrabajada);
        ett.setEt(et);
        ett.setEtr(etr);
        ett.setComentario(comentario);
        
        return ett;
        
    }
          
    
    
}        